/*
 * author lmx
 * excel导出实现
 */

  $.fn.extend({
    tableExport: function(options) {
      var defaults = {
        separator: ',',
        ignoreColumn: [],
        tableName:'yourTableName',
        type:'csv',
        pdfFontSize:14,
        pdfLeftMargin:20,
        escape:'true',
        htmlContent:'false',
        consoleLog:'false'
      };

      var options = $.extend(defaults, options);
      var el = this;

      if(defaults.type == 'csv' || defaults.type == 'txt'){

        // Header
        var tdData ="";
        $(el).find('thead').find('tr').each(function() {
          tdData += "\n";
          $(this).filter(':visible').find('th').each(function(index,data) {
            if ($(this).css('display') != 'none'){
              if(defaults.ignoreColumn.indexOf(index) == -1){
                tdData += '"' + parseString($(this)) + '"' + defaults.separator;
              }
            }

          });
          tdData = $.trim(tdData);
          tdData = $.trim(tdData).substring(0, tdData.length -1);
        });

        // Row vs Column
        $(el).find('tbody').find('tr').each(function() {
          tdData += "\n";
          $(this).filter(':visible').find('td').each(function(index,data) {
            if ($(this).css('display') != 'none'){
              if(defaults.ignoreColumn.indexOf(index) == -1){
                tdData += '"'+ parseString($(this)) + '"'+ defaults.separator;
              }
            }
          });
          //tdData = $.trim(tdData);
          tdData = $.trim(tdData).substring(0, tdData.length -1);
        });

        //output
        if(defaults.consoleLog == 'true'){
          console.log(tdData);
        }
        // var base64data = 'data:application/'+defaults.type+';charset=utf-8,\ufeff' + tdData;
        let blob = new Blob(["\ufeff"+ tdData], { type: 'text/csv' });
        let blobUrl = URL.createObjectURL(blob);
        var link = document.createElement("a");
        link.setAttribute("href", blobUrl);
        link.setAttribute("download", "数据导出.csv");
        document.body.appendChild(link);
        link.click();
      }else if(defaults.type == 'sql'){

        // Header
        var tdData ="INSERT INTO `"+defaults.tableName+"` (";
        $(el).find('thead').find('tr').each(function() {

          $(this).filter(':visible').find('th').each(function(index,data) {
            if ($(this).css('display') != 'none'){
              if(defaults.ignoreColumn.indexOf(index) == -1){
                tdData += '`' + parseString($(this)) + '`,' ;
              }
            }

          });
          tdData = $.trim(tdData);
          tdData = $.trim(tdData).substring(0, tdData.length -1);
        });
        tdData += ") VALUES ";
        // Row vs Column
        $(el).find('tbody').find('tr').each(function() {
          tdData += "(";
          $(this).filter(':visible').find('td').each(function(index,data) {
            if ($(this).css('display') != 'none'){
              if(defaults.ignoreColumn.indexOf(index) == -1){
                tdData += '"'+ parseString($(this)) + '",';
              }
            }
          });

          tdData = $.trim(tdData).substring(0, tdData.length -1);
          tdData += "),";
        });
        tdData = $.trim(tdData).substring(0, tdData.length -1);
        tdData += ";";

        //output
        //console.log(tdData);

        if(defaults.consoleLog == 'true'){
          console.log(tdData);
        }

        var base64data = "base64," + $.base64.encode(tdData);
        window.open('data:application/sql;filename=exportData;' + base64data);


      }else if(defaults.type == 'json'){

        var jsonHeaderArray = [];
        $(el).find('thead').find('tr').each(function() {
          var tdData ="";
          var jsonArrayTd = [];

          $(this).filter(':visible').find('th').each(function(index,data) {
            if ($(this).css('display') != 'none'){
              if(defaults.ignoreColumn.indexOf(index) == -1){
                jsonArrayTd.push(parseString($(this)));
              }
            }
          });
          jsonHeaderArray.push(jsonArrayTd);

        });

        var jsonArray = [];
        $(el).find('tbody').find('tr').each(function() {
          var tdData ="";
          var jsonArrayTd = [];

          $(this).filter(':visible').find('td').each(function(index,data) {
            if ($(this).css('display') != 'none'){
              if(defaults.ignoreColumn.indexOf(index) == -1){
                jsonArrayTd.push(parseString($(this)));
              }
            }
          });
          jsonArray.push(jsonArrayTd);

        });

        var jsonExportArray =[];
        jsonExportArray.push({header:jsonHeaderArray,data:jsonArray});

        //Return as JSON
        //console.log(JSON.stringify(jsonExportArray));

        //Return as Array
        //console.log(jsonExportArray);
        if(defaults.consoleLog == 'true'){
          console.log(JSON.stringify(jsonExportArray));
        }
        var base64data = "base64," + $.base64.encode(JSON.stringify(jsonExportArray));
        window.open('data:application/json;filename=exportData;' + base64data);
      }else if(defaults.type == 'xml'){

        var xml = '<?xml version="1.0" encoding="utf-8"?>';
        xml += '<tabledata><fields>';

        // Header
        $(el).find('thead').find('tr').each(function() {
          $(this).filter(':visible').find('th').each(function(index,data) {
            if ($(this).css('display') != 'none'){
              if(defaults.ignoreColumn.indexOf(index) == -1){
                xml += "<field>" + parseString($(this)) + "</field>";
              }
            }
          });
        });
        xml += '</fields><data>';

        // Row Vs Column
        var rowCount=1;
        $(el).find('tbody').find('tr').each(function() {
          xml += '<row id="'+rowCount+'">';
          var colCount=0;
          $(this).filter(':visible').find('td').each(function(index,data) {
            if ($(this).css('display') != 'none'){
              if(defaults.ignoreColumn.indexOf(index) == -1){
                xml += "<column-"+colCount+">"+parseString($(this))+"</column-"+colCount+">";
              }
            }
            colCount++;
          });
          rowCount++;
          xml += '</row>';
        });
        xml += '</data></tabledata>'

        if(defaults.consoleLog == 'true'){
          console.log(xml);
        }

        var base64data = "base64," + $.base64.encode(xml);
        window.open('data:application/xml;filename=exportData;' + base64data);

      }else if(defaults.type == 'excel' || defaults.type == 'doc'|| defaults.type == 'powerpoint'  ){
        //console.log($(this).html());
        var excel="<style>.text{mso-number-format:\"\\@\";}</style><table>";
        // Header
        $(el).find('thead').find('tr').each(function() {
          excel += "<tr>";
          $(this).filter(':visible').find('th').each(function(index,data) {
            if ($(this).css('display') != 'none'){
              if(defaults.ignoreColumn.indexOf(index) == -1){
                excel += "<td style='font-weight:bold;'>" + parseString($(this))+ "</td>";
              }
            }
          });
          excel += '</tr>';

        });


        // Row Vs Column
        var rowCount=1;
        $(el).find('tbody').find('tr').each(function() {
          excel += "<tr>";
          var colCount=0;
          $(this).filter(':visible').find('td').each(function(index,data) {
            if ($(this).css('display') != 'none'){
              if(defaults.ignoreColumn.indexOf(index) == -1){
                excel += "<td class='text'>"+parseString($(this))+"</td>";
              }
            }
            colCount++;
          });
          rowCount++;
          excel += '</tr>';
        });
        excel += '</table>'

        if(defaults.consoleLog == 'true'){
          console.log(excel);
        }

        var excelFile = "<html xmlns:o='urn:schemas-microsoft-com:office:office' xmlns:x='urn:schemas-microsoft-com:office:"+defaults.type+"' xmlns='http://www.w3.org/TR/REC-html40'>";
        excelFile += "<head>";
        excelFile += "<!--[if gte mso 9]>";
        excelFile += "<xml>";
        excelFile += "<x:ExcelWorkbook>";
        excelFile += "<x:ExcelWorksheets>";
        excelFile += "<x:ExcelWorksheet>";
        excelFile += "<x:Name>";
        excelFile += "{worksheet}";
        excelFile += "</x:Name>";
        excelFile += "<x:WorksheetOptions>";
        excelFile += "<x:DisplayGridlines/>";
        excelFile += "</x:WorksheetOptions>";
        excelFile += "</x:ExcelWorksheet>";
        excelFile += "</x:ExcelWorksheets>";
        excelFile += "</x:ExcelWorkbook>";
        excelFile += "</xml>";
        excelFile += "<![endif]-->";
        excelFile += "</head>";
        excelFile += "<body>";
        excelFile += excel;
        excelFile += "</body>";
        excelFile += "</html>";

        // var base64data = "base64," + $.base64.encode(excelFile);
        // window.open('data:application/vnd.ms-'+defaults.type+';filename=exportData.doc;' + base64data);
        let blob = new Blob(["\ufeff"+ excelFile], { type: 'text/excel' });
        let blobUrl = URL.createObjectURL(blob);
        let link = document.createElement("a");
        link.setAttribute("href", blobUrl);
        // let name = encodeURI("数据导出.xls");
        link.setAttribute("download", "数据导出.xls");
        document.body.appendChild(link);
        link.click();
        document.body.removeChild(link);
      }else if(defaults.type == 'png'){
        html2canvas($(el), {
          onrendered: function(canvas) {
            var img = canvas.toDataURL("image/png");
            window.open(img);
          }
        });
      }else if(defaults.type == 'pdf'){

        var doc = new jsPDF('p','pt', 'a4', true);
        doc.setFontSize(defaults.pdfFontSize);

        // Header
        var startColPosition=defaults.pdfLeftMargin;
        $(el).find('thead').find('tr').each(function() {
          $(this).filter(':visible').find('th').each(function(index,data) {
            if ($(this).css('display') != 'none'){
              if(defaults.ignoreColumn.indexOf(index) == -1){
                var colPosition = startColPosition+ (index * 50);
                doc.text(colPosition,20, parseString($(this)));
              }
            }
          });
        });


        // Row Vs Column
        var startRowPosition = 20; var page =1;var rowPosition=0;
        $(el).find('tbody').find('tr').each(function(index,data) {
          rowCalc = index+1;

          if (rowCalc % 26 == 0){
            doc.addPage();
            page++;
            startRowPosition=startRowPosition+10;
          }
          rowPosition=(startRowPosition + (rowCalc * 10)) - ((page -1) * 280);

          $(this).filter(':visible').find('td').each(function(index,data) {
            if ($(this).css('display') != 'none'){
              if(defaults.ignoreColumn.indexOf(index) == -1){
                var colPosition = startColPosition+ (index * 50);
                doc.text(colPosition,rowPosition, parseString($(this)));
              }
            }

          });

        });

        // Output as Data URI
        doc.output('datauri');

      }


      function parseString(data){
        let content_data = null;
        if(defaults.htmlContent == 'true'){
          content_data = data.html().trim();
        }else{
          content_data = data.text().trim();
        }

        if(defaults.escape == 'true'){
          content_data = escape(content_data);
        }

        return content_data;
      }

    }
  });
